package app.maker.metier.userImpl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import app.maker.entity.User;
import app.maker.error.UserException;
import app.maker.metier.entite.Authentification;
import app.maker.metier.userIntf.IGestionUser;
import app.maker.user.intf.IUser;

@Stateless(mappedName = "gestionUser")
public class GestionUser implements IGestionUser {

	@EJB
	private IUser iuser;

	public void creerUser(User monUser) throws UserException {
		if (monUser.getAdresse().compareTo("") == 0) {
			throw new UserException(
					"Adresse de l'utilisateur manquante, veuillez renseigner l'adresse !");
		}
		if (monUser.getFonction().compareTo("") == 0) {
			throw new UserException(
					"La fonction de l'utilisateur est manquante, veuillez renseigner la fonction !");
		}
		if (monUser.getNom().compareTo("") == 0) {
			throw new UserException(
					"Le nom de l'utilisateur est manquant, veuillez renseigner le nom !");
		}
		if (monUser.getDateArrivee() == null) {
			throw new UserException(
					"La date d'arrivée est manquante, veuillez renseigner la date d'arrivée !");
		}
		if (monUser.getLogin().compareTo("") == 0) {
			throw new UserException(
					"Le login est manquant, veuillez renseigner le login !");
		} else {
			List<User> allUsers = this.iuser.getAllUser();
			for (User u : allUsers) {
				if (u.getLogin().compareTo(monUser.getLogin()) == 0) {
					throw new UserException(
							"Le login est déjà existant, veuillez choisir un autre login !");
				}
			}
		}
		if (monUser.getMotDePasse().compareTo("") == 0) {
			throw new UserException(
					"Le mot de passe est manquant, veuillez renseigner le mot de passe !");
		}
		if ((monUser.getRole() != 0) && (monUser.getRole() != 1)
				&& (monUser.getRole() != 2) && (monUser.getRole() != 3)) {
			throw new UserException(
					"Le role n'est pas renseigné correctement !");
		}
		if (monUser.getSalaire() < 0) {
			throw new UserException(
					"Le salaire n'est pas renseigné correctement !");
		}
		if (monUser.getStatut() != 0 && monUser.getStatut() != 1) {
			throw new UserException(
					"Le statut n'est pas complété correctement !");
		}

		this.iuser.updateUser(monUser);

	}

	public void bloquerUser(User monUser) throws UserException {
		/*
		 * statut == 0 => utilisateur bloque statut == 1 => utilisateur non
		 * bloque
		 */
		List<User> allUsers = this.iuser.getAllUser();
		User userAModifier = null;
		boolean trouve = false;
		for (User u : allUsers) {
			if (u.getLogin().compareTo(monUser.getLogin()) == 0) {
				userAModifier = u;
				userAModifier.setStatut((byte) 0);
				trouve = true;
			}
		}
		if (trouve == false) {
			throw new UserException("L'utilisateur n'existe pas !");
		} else {
			this.iuser.updateUser(userAModifier);
		}
	}

	public void debloquerUser(User monUser) throws UserException {
		List<User> allUsers = this.iuser.getAllUser();
		boolean trouve = false;
		User userAModifier = null;
		for (User u : allUsers) {
			if (u.getLogin().compareTo(monUser.getLogin()) == 0) {
				userAModifier = u;
				userAModifier.setStatut((byte) 1);
				trouve = true;
			}
		}
		if (trouve == false) {
			throw new UserException("L'utilisateur n'existe pas !");
		} else {
			this.iuser.updateUser(userAModifier);
		}
	}

	public void supprimerUser(User monUser) throws UserException {
		List<User> allUsers = this.iuser.getAllUser();
		User userASupprimer = null;
		boolean trouve = false;
		for (User u : allUsers) {
			if (u.getLogin().compareTo(monUser.getLogin()) == 0) {
				userASupprimer = u;
				trouve = true;
			}
		}
		if (trouve == false) {
			throw new UserException("L'utilisateur n'existe pas !");
		} else {
			this.iuser.deleteUser(userASupprimer);
		}
	}

	public User consulterUserLogin(String login) throws UserException {
		List<User> allUsers = this.iuser.getAllUser();
		User monUser = null;
		boolean trouve = false;
		for (User u : allUsers) {
			if (u.getLogin().compareTo(login) == 0) {
				trouve = true;
				monUser = u;
			}
		}
		if (trouve == false) {
			throw new UserException("L'utilisateur n'existe pas !");
		}
		return monUser;
	}

	public User consulterUserNom(String nom) throws UserException {
		List<User> allUsers = this.iuser.getAllUser();
		User monUser = null;
		boolean trouve = false;
		for (User u : allUsers) {
			if (u.getNom().compareTo(nom) == 0) {
				trouve = true;
				monUser = u;
			}
		}
		if (trouve == false) {
			throw new UserException("L'utilisateur n'existe pas !");
		}
		return monUser;
	}

	public Authentification connect(Authentification authentification)
			throws UserException {
		User auth = new User();
		auth = iuser.getUserByLogin(authentification.getLogin());
		if (auth != null) {
			if (auth.getMotDePasse().equals(authentification.getMdp())) {
				authentification.setEtat(true);
				authentification.setId(auth.getId());
				authentification.setRole(auth.getRole());
				authentification.setStatut(auth.getStatut());
				return authentification;
			} else
				return authentification;
		} else
			throw new UserException("Utilisateur : "
					+ authentification.getLogin() + " inexistant !!!");

	}

	public void updateUserDetails(User monUser) throws UserException {
		if (monUser.getAdresse().compareTo("") == 0) {
			throw new UserException(
					"Adresse de l'utilisateur manquante, veuillez renseigner l'adresse !");
		}
		if (monUser.getFonction().compareTo("") == 0) {
			throw new UserException(
					"La fonction de l'utilisateur est manquante, veuillez renseigner la fonction !");
		}
		if (monUser.getNom().compareTo("") == 0) {
			throw new UserException(
					"Le nom de l'utilisateur est manquant, veuillez renseigner le nom !");
		}
		if (monUser.getDateArrivee() == null) {
			throw new UserException(
					"La date d'arrivée est manquante, veuillez renseigner la date d'arrivée !");
		}
		if (monUser.getLogin().compareTo("") == 0) {
			throw new UserException(
					"Le login est manquant, veuillez renseigner le login !");
		} else {
			List<User> allUsers = this.iuser.getAllUser();
			for (User u : allUsers) {
				if (u.getLogin().compareTo(monUser.getLogin()) == 0) {
					monUser.setId(u.getId());
				}
			}
		}
		if (monUser.getMotDePasse().compareTo("") == 0) {
			throw new UserException(
					"Le mot de passe est manquant, veuillez renseigner le mot de passe !");
		}
		if ((monUser.getRole() != 0) && (monUser.getRole() != 1)
				&& (monUser.getRole() != 2) && (monUser.getRole() != 3)) {
			throw new UserException(
					"Le role n'est pas renseigné correctement !");
		}
		if (monUser.getSalaire() < 0) {
			throw new UserException(
					"Le salaire n'est pas renseigné correctement !");
		}
		if (monUser.getStatut() != 0 && monUser.getStatut() != 1) {
			throw new UserException(
					"Le statut n'est pas complété correctement !");
		}

		this.iuser.updateUser(monUser);

	}

	public User consulterUser(int id) throws UserException {
		return iuser.getUser(id);
	}

	public List<User> listAll() {
		return iuser.getAllUser();
	}

	public List<User> listUserActif() {
		List<User> liste = iuser.getAllUser();
		List<User> result = new ArrayList<User>();
		if (liste != null && liste.size() > 0) {
			for (User u : liste)
				if (u.getStatut() == 1)
					result.add(u);
		}
		return result;
	}

	public List<User> listUserBlock() {
		List<User> liste = iuser.getAllUser();
		List<User> result = new ArrayList<User>();
		if (liste != null && liste.size() > 0) {
			for (User u : liste)
				if (u.getStatut() == 1)
					result.add(u);
		}
		return result;
	}

	public String toStringUser(User user) {
		return "ID : " + user.getId() + " Login : " + user.getLogin();
	}

}
